package com.easycoding.framework.repository.support.query;

import java.util.ArrayList;
import java.util.List;

import com.easycoding.framework.repository.support.query.expression.FieldExpression;
import com.easycoding.framework.repository.support.query.expression.ValueExpression;



/**
 * 查询规则
 *
 */
public class Criteria {
	
	/**
	 * 字段表达式
	 */
	private QueryExpression<?> key;
	
	/**值表达式*/
	private List<QueryExpression<?>> values = new ArrayList<QueryExpression<?>>();
	
	/**子规则*/
	private Criteria[] children;
	
	/**过滤类型*/
	private MatchType matchType;
	
	/**查询类型*/
	private QueryType queryType;
	
	/**是否为非*/
	private boolean not;
	
	/**多规则构造函数*/
	protected Criteria(QueryType queryType , Criteria... criterias){
		this.queryType = queryType;
		this.children = criterias;
	}
	
	/**
	 * 值构造函数
	 */
	protected Criteria(QueryExpression<?> key){
		this.key = key;
	}
	
	/**
	 * 清空值
	 */
	protected void clearValues(){
		this.values.clear();
	}

	/**
	 * 获取过滤类型
	 * @return matchType 过滤类型
	 */
	protected MatchType getMatchType() {
		return matchType;
	}

	/**
	 * @return queryType 查询类型
	 */
	protected QueryType getQueryType() {
		return queryType;
	}

	/**
	 * 获取字段表达式
	 * @return key 字段表达式
	 */
	protected QueryExpression<?> getKey() {
		return key;
	}

	/**
	 * 获取值表达式
	 * @return values 值表达式
	 */
	protected List<QueryExpression<?>> getValues() {
		return values;
	}

	/**
	 * @return 子规则
	 */
	protected Criteria[] getChildren() {
		return children;
	}
	
	/**
	 * 创建字段表达式
	 * @param field
	 * @return
	 */
	public static <Y> QueryExpression<Y> field(String field){
		QueryExpression<Y> expression =  new FieldExpression<Y>(field);
		return expression;
	}
	
	/**
	 * 创建值表达式
	 * @param value
	 * @return
	 */
	public static QueryExpression<Object> value(Object value){
		ValueExpression expression = new ValueExpression(value);
		return expression;
	}
	
	/**
	 * 是否为非
	 */
	protected boolean isNot() {
		return not;
	}

	/**
	 * 非查询
	 */
	public void not() {
		this.not = true;
	}
	
	/**
	 * and 查询
	 * @param criterias
	 * @return
	 */
	public static Criteria and(Criteria... criterias){
		Criteria criteria = new Criteria(QueryType.and,criterias);
		return criteria;
	}
	
	/**
	 * or 查询
	 * @param criterias
	 * @return
	 */
	public static Criteria or(Criteria... criterias){
		Criteria criteria = new Criteria(QueryType.or,criterias);
		return criteria;
	}

	/**
	 *设置 值表达式
	 * @param values 值表达式
	 */
	protected void setValues(List<QueryExpression<?>> values) {
		this.values = values;
	}

	/**
	 *设置 子规则
	 * @param children 子规则
	 */
	protected void setChildren(Criteria[] children) {
		this.children = children;
	}

	/**
	 *设置 过滤类型
	 * @param matchType 过滤类型
	 */
	protected void setMatchType(MatchType matchType) {
		this.matchType = matchType;
	}

	/**
	 *设置 查询类型
	 * @param queryType 查询类型
	 */
	protected void setQueryType(QueryType queryType) {
		this.queryType = queryType;
	}

	/**
	 *设置 是否为非
	 * @param not 是否为非
	 */
	protected void setNot(boolean not) {
		this.not = not;
	}
	
}
